package com.zshan.clinic.admin.mapper.medical;


import com.zshan.clinic.admin.entity.medical.schedule.TimeRange;
import com.zshan.clinic.admin.entity.vo.*;
import com.zshan.clinic.admin.entity.vo.print.ClinicRegisterPrintVo;
import com.zshan.clinic.mybatis.SuperMapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDate;
import java.util.List;

public interface SpecRegisterMapper extends SuperMapper {

    /**
     * 查询挂号数量
     * @param clinicId
     * @param patientName
     * @param deptId
     * @param doctorId
     * @param visitDate
     * @param regStatus
     * @return
     */
    Long getRegisterCount(@Param("clinicId") Long clinicId,
                          @Param("patientName") String patientName,
                          @Param("deptId") Long deptId,
                          @Param("doctorId") Long doctorId,
                          @Param("visitDate") LocalDate visitDate,
                          @Param("regStatus") String regStatus);

    /**
     * 查询挂号列表
     * @param clinicId
     * @param patientName
     * @param deptId
     * @param doctorId
     * @param visitDate
     * @param regStatus
     * @param offset
     * @param limit
     * @return
     */
    List<ClinicRegisterVo> getRegisterList(@Param("clinicId") Long clinicId,
                                           @Param("patientName") String patientName,
                                           @Param("deptId") Long deptId,
                                           @Param("doctorId") Long doctorId,
                                           @Param("visitDate") LocalDate visitDate,
                                           @Param("regStatus") String regStatus,
                                           @Param("offset") Integer offset,
                                           @Param("limit") Integer limit);

    /**
     * 挂号-医生列表
     * @param clinicId
     * @param visitDate
     * @return
     */
    List<DoctorRegisterDailyVo> getDoctorList(@Param("clinicId") Long clinicId,
                                              @Param("visitDate") LocalDate visitDate);

    /**
     * 挂号医生余号列表
     * @param doctorName
     * @return
     */
    List<DeptRemainVo> getRemainList(@Param("clinicId") Long clinicId,
                                     @Param("deptId") Long deptId,
                                     @Param("doctorId") Long doctorId,
                                     @Param("visitDate") LocalDate visitDate,
                                     @Param("doctorName") String doctorName,
                                     @Param("regStatusList") List<String> regStatusList);


    Long getCancelRegisterCount(@Param("clinicId") Long clinicId,
                                @Param("shiftId") Long shiftId,
                                @Param("doctorId") Long doctorId,
                                @Param("rangeList") List<TimeRange> rangeList);

    /**
     * 查询需要退号的列表
     * @param clinicId
     * @param visitDate
     * @param doctorId
     * @param rangeList
     * @return
     */
    List<ClinicRegisterVo> getCancelRegisterList(@Param("clinicId") Long clinicId,
                                                 @Param("visitDate") LocalDate visitDate,
                                                 @Param("doctorId") Long doctorId,
                                                 @Param("rangeList") List<TimeRange> rangeList);

    /**
     * 查询患者挂号记录数
     * @param clinicId
     * @param patientId
     * @param visitDate
     * @return
     */
    Long getPatientRegCount(@Param("clinicId") Long clinicId,
                            @Param("patientId") Long patientId,
                            @Param("visitDate") LocalDate visitDate);

    /**
     * 查询患者挂号记录列表
     * @param clinicId
     * @param patientId
     * @param visitDate
     * @param offset
     * @param limit
     * @return
     */
    List<ClinicRegisterPatientVo> getPatientRegList(@Param("clinicId") Long clinicId,
                                                    @Param("patientId") Long patientId,
                                                    @Param("visitDate") LocalDate visitDate,
                                                    @Param("offset") Integer offset,
                                                    @Param("limit") Integer limit);

    Integer getMaxSeqNo(@Param("visitDate") LocalDate visitDate,
                        @Param("clinicId") Long clinicId,
                        @Param("doctorId") Long doctorId,
                        @Param("visitPeriod") String visitPeriod);

    /**
     * 小程序查询预约列表
     * @param clinicId
     * @param cmUserId
     * @param regStatus
     * @param offset
     * @param limit
     * @return
     */
    List<ClinicRegisterVo> getAppointmentList(@Param("clinicId") Long clinicId,
                                              @Param("cmUserId") Long cmUserId,
                                              @Param("regStatus") String regStatus,
                                              @Param("offset") Integer offset,
                                              @Param("limit") Integer limit);

    /**
     * 挂号统计
     * @param clinicId
     * @param patientName
     * @param deptId
     * @param doctorId
     * @param visitDate
     * @return
     */
    StatClinicRegVo getStatReg(@Param("clinicId") Long clinicId,
                               @Param("patientName") String patientName,
                               @Param("deptId") Long deptId,
                               @Param("doctorId") Long doctorId,
                               @Param("visitDate") LocalDate visitDate);

    /**
     * 打印挂号单
     * @param registerId
     * @return
     */
    ClinicRegisterPrintVo getRegisterPrintDetail(@Param("clinicId") Long clinicId,
                                                 @Param("registerId") Long registerId);
}
